ποΈGitΠ―ΡΠ°ποΈ
.github/agents/speckit.tasks.agent.md 97ce3cd27f7edc7f2480bc0c8bc4fb572d2d3fc1 (97ce3cd2) Text, 9.48 KB
---
description: Generate an actionable, dependency-ordered tasks.md for the feature based on available design artifacts.
handoffs:
Tff7b72- label: Analyze For Consistency
agent: speckit.analyze
prompt: Run a project analysis for consistency
send: true
Tff7b72- label: Implement Project
agent: speckit.implement
prompt: Start the implementation in phases
Tc9d1d9 send: true
Tc9d1d9---
Tc9d1d9## User Input
Ta5d6ff```Ta5d6fftext
$ARGUMENTS
Ta5d6ff```
You **MUST** consider the user input before proceeding (if not empty).
Tc9d1d9## Pre-Execution Checks
**Check for extension hooks (before tasks generation)**:
Tff7b72- Check if Ta5d6ff`.specify/extensions.yml` exists in the project root.
Tff7b72- If it exists, read it and look for entries under the Ta5d6ff`hooks.before_tasks` key
Tff7b72- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
Tff7b72- Filter out hooks where Ta5d6ff`enabled` is explicitly Ta5d6ff`false`. Treat hooks without an Ta5d6ff`enabled` field as enabled by default.
Tff7b72- For each remaining hook, do **not** attempt to interpret or evaluate hook Ta5d6ff`condition` expressions:
Tff7b72- If the hook has no Ta5d6ff`condition` field, or it is null/empty, treat the hook as executable
Tff7b72- If the hook defines a non-empty Ta5d6ff`condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
Tff7b72- For each executable hook, output the following based on its Ta5d6ff`optional` flag:
Tff7b72- **Optional hook** (Ta5d6ff`optional: true`):
Ta5d6ff ```
## Extension Hooks
**Optional Pre-Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
```
Tff7b72- **Mandatory hook** (Ta5d6ff`optional: false`):
Ta5d6ff ```
## Extension Hooks
**Automatic Pre-Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
Wait for the result of the hook command before proceeding to the Outline.
```
Tff7b72- If no hooks are registered or Ta5d6ff`.specify/extensions.yml` does not exist, skip silently
Tc9d1d9## Outline
Tff7b721. **Setup**: Run Ta5d6ff`.specify/scripts/bash/setup-tasks.sh --json` from repo root and parse FEATURE_DIR, TASKS_TEMPLATE, and AVAILABLE_DOCS list. Ta5d6ff`FEATURE_DIR` and Ta5d6ff`TASKS_TEMPLATE` must be absolute paths when provided. Ta5d6ff`AVAILABLE_DOCS` is a list of document names/relative paths available under Ta5d6ff`FEATURE_DIR` (for example Ta5d6ff`research.md` or Ta5d6ff`contracts/`). For single quotes in args like "I'm Groot", use escape syntax: e.g 'I'\''m Groot' (or double-quote if possible: "I'm Groot").
Tff7b722. **Load design documents**: Read from FEATURE_DIR:
Tff7b72- **Required**: plan.md (tech stack, libraries, structure), spec.md (user stories with priorities)
Tff7b72- **Optional**: data-model.md (entities), contracts/ (interface contracts), research.md (decisions), quickstart.md (test scenarios)
Tff7b72- Note: Not all projects have all documents. Generate tasks based on what's available.
Tff7b723. **Execute task generation workflow**:
Tff7b72- Load plan.md and extract tech stack, libraries, project structure
Tff7b72- Load spec.md and extract user stories with their priorities (P1, P2, P3, etc.)
Tff7b72- If data-model.md exists: Extract entities and map to user stories
Tff7b72- If contracts/ exists: Map interface contracts to user stories
Tff7b72- If research.md exists: Extract decisions for setup tasks
Tff7b72- Generate tasks organized by user story (see Task Generation Rules below)
Tff7b72- Generate dependency graph showing user story completion order
Tff7b72- Create parallel execution examples per user story
Tff7b72- Validate task completeness (each user story has all needed tasks, independently testable)
Tff7b724. **Generate tasks.md**: Read the tasks template from TASKS_TEMPLATE (from the JSON output above) and use it as structure. If TASKS_TEMPLATE is empty, fall back to Ta5d6ff`.specify/templates/tasks-template.md`. Fill with:
Tff7b72- Correct feature name from plan.md
Tff7b72- Phase 1: Setup tasks (project initialization)
Tff7b72- Phase 2: Foundational tasks (blocking prerequisites for all user stories)
Tff7b72- Phase 3+: One phase per user story (in priority order from spec.md)
Tff7b72- Each phase includes: story goal, independent test criteria, tests (if requested), implementation tasks
Tff7b72- Final Phase: Polish & cross-cutting concerns
Tff7b72- All tasks must follow the strict checklist format (see Task Generation Rules below)
Tff7b72- Clear file paths for each task
Tff7b72- Dependencies section showing story completion order
Tff7b72- Parallel execution examples per story
Tff7b72- Implementation strategy section (MVP first, incremental delivery)
Tff7b725. **Report**: Output path to generated tasks.md and summary:
Tff7b72- Total task count
Tff7b72- Task count per user story
Tff7b72- Parallel opportunities identified
Tff7b72- Independent test criteria for each story
Tff7b72- Suggested MVP scope (typically just User Story 1)
Tff7b72- Format validation: Confirm ALL tasks follow the checklist format (checkbox, ID, labels, file paths)
Tff7b726. **Check for extension hooks**: After tasks.md is generated, check if Ta5d6ff`.specify/extensions.yml` exists in the project root.
Tff7b72- If it exists, read it and look for entries under the Ta5d6ff`hooks.after_tasks` key
Tff7b72- If the YAML cannot be parsed or is invalid, skip hook checking silently and continue normally
Tff7b72- Filter out hooks where Ta5d6ff`enabled` is explicitly Ta5d6ff`false`. Treat hooks without an Ta5d6ff`enabled` field as enabled by default.
Tff7b72- For each remaining hook, do **not** attempt to interpret or evaluate hook Ta5d6ff`condition` expressions:
Tff7b72- If the hook has no Ta5d6ff`condition` field, or it is null/empty, treat the hook as executable
Tff7b72- If the hook defines a non-empty Ta5d6ff`condition`, skip the hook and leave condition evaluation to the HookExecutor implementation
Tff7b72- For each executable hook, output the following based on its Ta5d6ff`optional` flag:
Tff7b72- **Optional hook** (Ta5d6ff`optional: true`):
Ta5d6ff ```
## Extension Hooks
**Optional Hook**: {extension}
Command: `/{command}`
Description: {description}
Prompt: {prompt}
To execute: `/{command}`
```
Tff7b72- **Mandatory hook** (Ta5d6ff`optional: false`):
Ta5d6ff ```
## Extension Hooks
**Automatic Hook**: {extension}
Executing: `/{command}`
EXECUTE_COMMAND: {command}
```
Tff7b72- If no hooks are registered or Ta5d6ff`.specify/extensions.yml` does not exist, skip silently
Context for task generation: $ARGUMENTS
The tasks.md should be immediately executable - each task must be specific enough that an LLM can complete it without additional context.
Tc9d1d9## Task Generation Rules
**CRITICAL**: Tasks MUST be organized by user story to enable independent implementation and testing.
**Tests are OPTIONAL**: Only generate test tasks if explicitly requested in the feature specification or if user requests TDD approach.
Tc9d1d9### Checklist Format (REQUIRED)
Every task MUST strictly follow this format:
Ta5d6ff```Ta5d6fftext
[ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path [ ] [TaskID] [P?] [Story?] Description with file path
Ta5d6ff```
**Format Components**:
Tff7b721. **Checkbox**: ALWAYS start with Ta5d6ff`- [ ]` (markdown checkbox)
Tff7b722. **Task ID**: Sequential number (T001, T002, T003...) in execution order
Tff7b723. **[P] marker**: Include ONLY if task is parallelizable (different files, no dependencies on incomplete tasks)
Tff7b724. **[Story] label**: REQUIRED for user story phase tasks only
Tff7b72- Format: [US1], [US2], [US3], etc. (maps to user stories from spec.md)
Tff7b72- Setup phase: NO story label
Tff7b72- Foundational phase: NO story label
Tff7b72- User Story phases: MUST have story label
Tff7b72- Polish phase: NO story label
Tff7b725. **Description**: Clear action with exact file path
**Examples**:
Tff7b72- β
CORRECT: Ta5d6ff`- [ ] T001 Create project structure per implementation plan`
Tff7b72- β
CORRECT: Ta5d6ff`- [ ] T005 [P] Implement authentication middleware in src/middleware/auth.py`
Tff7b72- β
CORRECT: Ta5d6ff`- [ ] T012 [P] [US1] Create User model in src/models/user.py`
Tff7b72- β
CORRECT: Ta5d6ff`- [ ] T014 [US1] Implement UserService in src/services/user_service.py`
Tff7b72- β WRONG: Ta5d6ff`- [ ] Create User model` (missing ID and Story label)
Tff7b72- β WRONG: Ta5d6ff`T001 [US1] Create model` (missing checkbox)
Tff7b72- β WRONG: Ta5d6ff`- [ ] [US1] Create User model` (missing Task ID)
Tff7b72- β WRONG: Ta5d6ff`- [ ] T001 [US1] Create model` (missing file path)
Tc9d1d9### Task Organization
Tff7b721. **From User Stories (spec.md)** - PRIMARY ORGANIZATION:
Tff7b72- Each user story (P1, P2, P3...) gets its own phase
Tff7b72- Map all related components to their story:
Tff7b72- Models needed for that story
Tff7b72- Services needed for that story
Tff7b72- Interfaces/UI needed for that story
Tff7b72- If tests requested: Tests specific to that story
Tff7b72- Mark story dependencies (most stories should be independent)
Tff7b722. **From Contracts**:
Tff7b72- Map each interface contract β to the user story it serves
Tff7b72- If tests requested: Each interface contract β contract test task [P] before implementation in that story's phase
Tff7b723. **From Data Model**:
Tff7b72- Map each entity to the user story(ies) that need it
Tff7b72- If entity serves multiple stories: Put in earliest story or Setup phase
Tff7b72- Relationships β service layer tasks in appropriate story phase
Tff7b724. **From Setup/Infrastructure**:
Tff7b72- Shared infrastructure β Setup phase (Phase 1)
Tff7b72- Foundational/blocking tasks β Foundational phase (Phase 2)
Tff7b72- Story-specific setup β within that story's phase
Tc9d1d9### Phase Structure
Tff7b72- **Phase 1**: Setup (project initialization)
Tff7b72- **Phase 2**: Foundational (blocking prerequisites - MUST complete before user stories)
Tff7b72- **Phase 3+**: User Stories in priority order (P1, P2, P3...)
Tff7b72- Within each story: Tests (if requested) β Models β Services β Endpoints β Integration
Tff7b72- Each phase should be a complete, independently testable increment
Tff7b72- **Final Phase**: Polish & Cross-Cutting Concerns
Served by rngit 1.5.2 - Generated in 0.18s